package com.example.mq.common;

import java.io.*;

/**
 * 如果想让这个对象能序列化或者反序列化，需要让这个类能够实现 Serializable 接口
 */
public class BinaryTool {
    //序列化
    //把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException{
        //这个流对象相当于变长的字节数组
        //可以把 object 序列化的数据给主键写入到 byteArrayInputStream 中，再同意转成 byte[]
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                //生成的二进制字节数据会写入到 ObjectOutputStream 中
                //由于 objectOutputStream  关联到了 ByteArrayOutputStream ，最终就会写入到 ByteArrayOutputStream 中
                objectOutputStream.writeObject(object);
            }
            //将 byteArrayOutputStream 中持有的二进制数据取出来转成 byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }

    //反序列化
    //把一个字节数组反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)) {
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                object = objectInputStream.readObject();
            }
        }
        return object;
    }
}
